/*
 * @lc app=leetcode.cn id=445 lang=cpp
 *
 * [445] 两数相加 II
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

// #include <iostream>
// #include <stack>
// using namespace std;

// struct ListNode {
//     int val;
//     ListNode* next;
//     ListNode() : val(0), next(nullptr) {}
//     ListNode(int x) : val(x), next(nullptr) {}
//     ListNode(int x, ListNode* next) : val(x), next(next) {}
// };

class Solution {
   public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry = 0;                  // 保存进位值
        stack<int> num1, num2;          // 保存链表中的数据
        ListNode* result = nullptr;     // 保存输出结果的第一个节点

        while (l1 != nullptr) {
            num1.push(l1->val);
            l1 = l1->next;
        }
        while (l2 != nullptr) {
            num2.push(l2->val);
            l2 = l2->next;
        }

        while (!num1.empty() || !num2.empty() || carry != 0) {
            int number1 = (num1.empty()) ? 0 : num1.top();
            int number2 = (num2.empty()) ? 0 : num2.top();
            if (!num1.empty()) {
                num1.pop();
            }
            if (!num2.empty()) {
                num2.pop();
            }

            int curValue = number1 + number2 + carry;
            carry = curValue / 10;
            curValue = curValue % 10;

            ListNode* curNode = new ListNode(curValue);
            curNode->next = result;
            result = curNode;
        }

        return result;
    }
};
// @lc code=end
